package com.study.recursion;

import java.io.File;

import org.junit.Test;

/**
* @Name: RecursionDemo
* @Description: 递归调用测试类
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-15 上午10:25:25 
* @Version: V1.0
 */
public class RecursionDemo {
	
	/**
	* @Name: getNFactorial
	* @Description: 求N的阶乘
	* 阶乘递归表达式：
	* 	a(1) = 1 ;	初始条件
	* 	a(n) = n! = n*a(n-1) 其中 n >= 2 ; 递归关系
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 上午10:27:15
	* @Parameters: @param n
	* @Return: int N的阶乘结果
	 */
	public int getNFactorial(int n) {
		//设置初始条件，结束递归
		if(n == 1) {
			return 1 ;
		} else {
			//根据递归关系式，进行递归
			return n*getNFactorial(n-1) ;
		}
	}
	
	@Test
	public void test() {
		int result = getNFactorial(5) ;
		System.out.println(result);
	}
	
	/**
	* @Name: getFibonacciNum
	* @Description: 求解n的斐波那契数
	* 斐波那契递归表达式：
	* 	初始条件：
	* 		a(1) = 1 ;  
			a(2) = 1 ;
		递归关系：
			a(n) = a(n-1) + a(n-2) ; 其中 n > 2 ;
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 上午10:51:08
	* @Parameters: @param n 求解参数
	* @Return: int 返回n的斐波那契数
	 */
	public int getFibonacciNum(int n) {
		//设置初始条件，如果n=1或n=2时，结束递归
		if(n <= 2) {
			return 1 ;
		} else {
			//根据递归关系式，进行递归
			return getFibonacciNum(n-1) + getFibonacciNum(n-2) ;
		}
	}
	
	@Test
	public void test02() {
		int result = getFibonacciNum(8) ;
		System.out.println(result);
	}
	
	/**
	* @Name: findJpgFileName
	* @Description: 递归查找指定目录下所有以'.jpg'结尾的文件，输出文件名称
	* 步骤：
	* 	1、根据指定目录名称，创建File对象
	* 	2、获取当前目录下所有的文件及目录的File对象数组
	* 	3、遍历每一个File数组元素，并进行判断
	* 		如果当前File元素为文件，判断文件后缀名
	* 			如果该文件以'.jpg'结尾	-->   递归初始条件：输出文件名称，即结束递归；
	* 		如果当前File元素为目录
	* 			以该目录为方法参数，进行递归查找 	-->   递归关系	
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 上午11:02:58
	* @Parameters: @param dirName
	* @Return: void
	 */
	public void findJpgFileName(String dirName) {
		//根据指定目录名称，创建File对象
		File file = new File(dirName) ;
		//获取当前目录下所有的文件及目录的File对象数组
		File[] fileList = file.listFiles() ;
		//遍历每一个File数组元素
		if (fileList != null && fileList.length > 0) {
			for (File f : fileList) {
				//如果当前File元素为文件
				if(f.isFile()) {
					//如果该文件以'.jpg'结尾
					if(f.getName().endsWith(".jpg")) {
						//输出该文件名称
						System.out.println(f.getAbsolutePath());
					}
				} else { //如果当前File元素为目录
					//递归查找当前目录
					findJpgFileName(f.getAbsolutePath()) ;
				}
			}
		}
	}
	
	@Test
	public void test03() {
		findJpgFileName("D:\\Documents\\Pictures\\images") ;
	}
	
	/**
	* @Name: deleteDir
	* @Description: 递归删除指定目录的所有内容
	* 步骤：
	* 	1、根据指定目录名称，创建File对象
	* 	2、获取当前目录下所有文件和目录的File对象数组
	* 	3、循环遍历数组中每一个File元素，删除当前目录下的所有文件
	* 		如果当前File元素为文件，删除文件   	-->   递归初始条件
	* 		如果当前File元素为目录， 	-->   递归关系
	* 	4、删除当前目录	-->   递归初始条件
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 上午11:09:12
	* @Parameters: @param dirName
	* @Return: void
	 */
	public void deleteDir(String dirName) {
		//根据指定目录名称，创建File对象
		File file = new File(dirName) ;
		//获取当前目录下所有文件和目录的File对象数组
		File[] fileList = file.listFiles() ;
		//删除当前目录下的所有文件
		if(fileList != null && fileList.length > 0) {
			for (File f : fileList) {
				//如果当前File元素为文件，删除文件
				if(f.isFile()) {
					System.out.println("删除文件路径：" + f.getAbsolutePath());
					f.delete() ;
				} 
				//如果当前File元素为目录
				if(f.isDirectory()) {
					//进行递归调用
					deleteDir(f.getAbsolutePath()) ;
				}
			}
		} 
		//删除当前目录
		System.out.println("删除目录路径：" + file.getAbsolutePath());
		file.delete() ;
	}
	
	@Test
	public void test04() {
		deleteDir("D:\\KDR") ;
	}

}
